package com.wans.order.service.imp;


import com.wans.order.bean.Order;
import com.wans.order.feign.ProductFeignClient;
import com.wans.order.service.OrderBuyService;
import com.wans.product.bean.Product;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

@Slf4j
@Service
@EnableFeignClients // 开启Feign客户端 远程调用
@SuppressWarnings("all")
public class OrderBuyImp implements OrderBuyService {

    @Autowired // 使用RestTemplate进行HTTP请求
    private RestTemplate restTemplate;
    @Autowired // 服务发现客户端
    DiscoveryClient  discoveryClient;
    @Autowired // Feign客户端
    private ProductFeignClient productFeignClient;


    @Override
    public Order createOrder(Long userId, Long productId) {

        // 获取商品信息
        //Product product = getProductLoadbalancer(productId);
        Product product = productFeignClient.getProduct(productId);  // Feign客户端远程调用

        Order order = new Order();
        order.setId(1L);
        // TODO:  获取订单总价
        order.setTotalAmount(product.getPrice().multiply(BigDecimal.valueOf(product.getNum())));
        order.setUserId(userId);
        order.setNickName("化名");
        order.setAddress("Cloud-learn");
        // TODO:  获取商品信息
        order.setProductList(Arrays.asList(product));


        return order;
    }

    /**
     * 获取商品信息
     * @param id 商品ID
     * @return 商品信息
     */
    public Product getProduct(Long id) {

        // 获取所有名为"service-product"的服务实例列表
        List<ServiceInstance> instances = discoveryClient.getInstances("server-product");

        // 选择第一个服务实例作为后续操作的目标
        ServiceInstance serviceInstance = instances.get(0);

        //  拼装完整服务实例的URL
        String strURL = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/product/getProduct/" + id;
        log.info("访问目标服务：{}", strURL);

        //  使用RestTemplate进行GET请求
        Product product = restTemplate.getForObject(strURL, Product.class);

        return product;
    }


    /**
     * 使用负载均衡器访问服务 注解式
     * @param id 商品ID
     * @return 商品信息
     */
    public Product getProductLoadbalancer(Long id) {

        //  拼装完整服务实例的URL
        String strURL = "http://server-product/product/getProduct/" + id;
        log.info("访问目标服务 -> {}", strURL);

        //  使用RestTemplate进行GET请求
        Product product = restTemplate.getForObject(strURL, Product.class);

        return product;
    }
}
